<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
use app\admin\model\PartyCircl;
use app\api\model\Activity;
use app\api\model\IntegralTask;
use app\api\model\Member;
use think\facade\Session;
use think\facade\Cache;
use think\facade\Db;
use think\Request;
use think\facade\Filesystem;
use think\facade\Image;

/**g工地查询身份
 * @param $id
 * @return void
 *
 */
function search_sf($id)
{
    $res = Db::name('base_user_upgrade')->where('id', $id)->find();
    return $res;
}

/** 根据经纬度计算距离
 * @param $latitude1
 * @param $longitude1
 * @param $latitude2
 * @param $longitude2
 * @return float|int
 */
function calculateDistance($latitude1, $longitude1, $latitude2, $longitude2)
{
    $earthRadius = 6371; // 地球半径（单位：千米）

    // 将经纬度转换为弧度
    $lat1 = deg2rad($latitude1);
    $lon1 = deg2rad($longitude1);
    $lat2 = deg2rad($latitude2);
    $lon2 = deg2rad($longitude2);

    // 应用 Haversine 公式计算距离
    $deltaLat = $lat2 - $lat1;
    $deltaLon = $lon2 - $lon1;
    $a        = sin($deltaLat / 2) * sin($deltaLat / 2) + cos($lat1) * cos($lat2) * sin($deltaLon / 2) * sin($deltaLon / 2);
    $c        = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $distance = $earthRadius * $c;

    return $distance;
}

function isMobile()
{
    if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
        return true;
    }
    if (isset($_SERVER['HTTP_VIA'])) {
        return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    }
    if (isset($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = [
            'nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce',
            'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile',
        ];
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    if (isset($_SERVER['HTTP_ACCEPT'])) {
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }
    return false;
}

/** 遍历所有上级分类id
 * @param $pid
 * @param $result
 * @return void
 * @throws \think\db\exception\DataNotFoundException
 * @throws \think\db\exception\DbException
 * @throws \think\db\exception\ModelNotFoundException
 */
function findParentIds($pid, &$result = [])
{

    $category = Db::name('shop_goods_cate')->where(['status' => 1, 'deleted' => 0])->where('id', $pid)->find();
    //dump($category);die;
    if ($category && $category['pid'] != 0) {
        $result[] = $category['pid'];              // 将当前分类的父级ID添加到结果数组
        findParentIds($category['pid'], $result);  // 递归查询父级的上级ID
    }
}

function checkPhoneNumber($phone_number)
{
    //@2017-11-25 14:25:45 https://zhidao.baidu.com/question/1822455991691849548.html
    //中国联通号码：130、131、132、145（无线上网卡）、155、156、185（iPhone5上市后开放）、186、176（4G号段）、175（2015年9月10日正式启用，暂只对北京、上海和广东投放办理）,166,146
    //中国移动号码：134、135、136、137、138、139、147（无线上网卡）、148、150、151、152、157、158、159、178、182、183、184、187、188、198
    //中国电信号码：133、153、180、181、189、177、173、149、199
    $g  = "/^1[34578]\d{9}$/";
    $g2 = "/^19[89]\d{8}$/";
    $g3 = "/^166\d{8}$/";
    if (preg_match($g, $phone_number)) {
        return true;
    } else {
        if (preg_match($g2, $phone_number)) {
            return true;
        } else {
            if (preg_match($g3, $phone_number)) {
                return true;
            }
        }
    }

    return false;
}

/**
 * 子元素计数器
 * @param  array  $array
 * @param  int    $pid
 * @return array
 */
function array_children_count($array, $pid)
{
    $counter = [];
    foreach ($array as $item) {
        $count = isset($counter[$item[$pid]]) ? $counter[$item[$pid]] : 0;
        $count++;
        $counter[$item[$pid]] = $count;
    }
    return $counter;
}

/**
 * 数组层级缩进转换
 * @param  array  $array  源数组
 * @param  int    $pid
 * @param  int    $level
 * @return array
 */
function array2level($array, $pid = 0, $level = 1)
{
    static $list = [];
    foreach ($array as $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $list[]     = $v;
            array2level($array, $v['id'], $level + 1);
        }
    }
    return $list;
}

/**
 * 构建层级（树状）数组
 * @param  array   $array           要进行处理的一维数组，经过该函数处理后，该数组自动转为树状数组
 * @param  string  $pid_name        父级ID的字段名
 * @param  string  $child_key_name  子元素键名
 * @return array|bool
 */
function array2tree(&$array, $pid_name = 'pid', $child_key_name = 'children')
{
    $counter = array_children_count($array, $pid_name);
    if (!isset($counter[0]) || $counter[0] == 0) {
        return $array;
    }
    $tree = [];
    while (isset($counter[0]) && $counter[0] > 0) {
        $temp = array_shift($array);
        if (isset($counter[$temp['id']]) && $counter[$temp['id']] > 0) {
            array_push($array, $temp);
        } else {
            if ($temp[$pid_name] == 0) {
                $tree[] = $temp;
            } else {
                $array = array_child_append($array, $temp[$pid_name], $temp, $child_key_name);
            }
        }
        $counter = array_children_count($array, $pid_name);
    }
    return $tree;
}

/**
 * 把元素插入到对应的父元素$child_key_name字段
 * @param          $parent
 * @param          $pid
 * @param          $child
 * @param  string  $child_key_name  子元素键名
 * @return mixed
 */
function array_child_append($parent, $pid, $child, $child_key_name)
{
    foreach ($parent as &$item) {
        if ($item['id'] == $pid) {
            if (!isset($item[$child_key_name])) {
                $item[$child_key_name] = [];
            }

            $item[$child_key_name][] = $child;
        }
    }
    return $parent;
}

/**
 * 手机号格式检查
 * @param  string  $mobile
 * @return bool
 */
function check_mobile_number($mobile)
{
    if (!is_numeric($mobile)) {
        return false;
    }
    $reg = '#^13[\d]{9}$|^14[5,7]{1}\d{8}$|^15[^4]{1}\d{8}$|^17[0,6,7,8]{1}\d{8}$|^18[\d]{9}$#';

    return preg_match($reg, $mobile) ? true : false;
}

//获取客户端真实IP
function getClientIP()
{
    global $ip;
    if (getenv("HTTP_CLIENT_IP")) {
        $ip = getenv("HTTP_CLIENT_IP");
    } else {
        if (getenv("HTTP_X_FORWARDED_FOR")) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        } else {
            if (getenv("REMOTE_ADDR")) {
                $ip = getenv("REMOTE_ADDR");
            } else {
                $ip = "Unknow";
            }
        }
    }

    return $ip;
}

/**
 * 获取 IP  地理位置
 * 淘宝IP接口
 * @Return: array
 */
function getCity($ip = '')
{
    if ($ip == '') {
        $url  = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json";
        $ip   = json_decode(file_get_contents($url), true);
        $data = $ip;
    } else {
        $url = "http://ip.taobao.com/service/getIpInfo.php?ip=" . $ip;
        $ip  = json_decode(file_get_contents($url));
        if ((string) $ip->code == '1') {
            return false;
        }
        $data = (array) $ip->data;
    }

    return $data;
}


/**
 * 短信发送
 * @param $to       接收人
 * @param $model    短信模板ID
 * @param $code     短信验证码
 * @return json
 */
function send_sms($to, $model, $code)
{
    require_once '../extend/alisms/vendor/autoload.php';
    Config::load(); //加载区域结点配置
    $config          = '根据你的实际情况读取配置文件或读取数据库，本项目是将配置写入数据库实现';
    $accessKeyId     = 'LTAI4GB87ao37EzWjdFwU8DS';
    $accessKeySecret = 'oy40oVg9jz0aCNqRChJjbJrLAw4o4F';
    $templateParam   = $code;
    //短信签名
    $signName = $config;
    //短信模板ID
    switch ($model) {
        case 1:
            $templateCode = $config['model_code_rl']; // 注册登录短信验证码模板
            break;
        case 2:
            $templateCode = $config['model_code_reset']; // 重置密码短信验证码模板
            break;
    }
    //短信API产品名（短信产品名固定，无需修改）
    $product = "Dysmsapi";
    //短信API产品域名（接口地址固定，无需修改）
    $domain = "dysmsapi.aliyuncs.com";
    //暂时不支持多Region（目前仅支持cn-hangzhou请勿修改）
    $region = "cn-hangzhou";
    // 初始化用户Profile实例
    $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);
    // 增加服务结点
    DefaultProfile::addEndpoint("cn-hangzhou", "cn-hangzhou", $product, $domain);
    // 初始化AcsClient用于发起请求
    $acsClient = new DefaultAcsClient($profile);
    // 初始化SendSmsRequest实例用于设置发送短信的参数
    $request = new SendSmsRequest();
    // 必填，设置雉短信接收号码

    $request->setPhoneNumbers($to);
    // 必填，设置签名名称
    // $signName = '哆唻易';
    $request->setSignName('中原聚信');
    // 必填，设置模板CODE
    $templateCode = 'SMS_210074237';
    $request->setTemplateCode($templateCode);
    // 可选，设置模板参数
    if ($templateParam) {
        $request->setTemplateParam(json_encode($templateParam));
    }
    //发起访问请求
    $acsResponse = $acsClient->getAcsResponse($request);
    //返回请求结果
    $result = json_decode(json_encode($acsResponse), true);
    // 具体返回值参考文档：https://help.aliyun.com/document_detail/55451.html?spm=a2c4g.11186623.6.563.YSe8FK
    return $result;
}

/**
 * 短信发送  多参数
 * @param $to    接收人
 * @return json
 */
function send_sms1($to, $code)
{
    require_once '../extend/alisms/vendor/autoload.php';
    Config::load(); //加载区域结点配置
    $accessKeyId     = 'LTAI4GB87ao37EzWjdFwU8DS';
    $accessKeySecret = 'oy40oVg9jz0aCNqRChJjbJrLAw4o4F';                                    //这个个是审核过的模板内容中的变量赋值，记住数组中字符串code要和模板内容中的保持一致 //好比咱们模板中的内容为：你的验证码为：${code}，该验证码5分钟内有效，请勿泄漏！
    $templateParam   = ["code" => $code];                                                   //模板变量替换
    $signName        = '华培';                                                                //这个是短信签名，要审核经过
    $templateCode    = 'SMS_243356656';                                                     //短信模板ID，记得要审核经过的 //短信API产品名（短信产品名固定，无需修改）
    $product         = "Dysmsapi";                                                          //短信API产品域名（接口地址固定，无需修改）
    $domain          = "dysmsapi.aliyuncs.com";                                             //暂时不支持多Region（目前仅支持cn-hangzhou请勿修改）
    $region          = "cn-hangzhou";                                                       // 初始化用户Profile实例
    $profile         = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret); // 增长服务结点
    DefaultProfile::addEndpoint("cn-hangzhou", "cn-hangzhou", $product, $domain);           // 初始化AcsClient用于发起请求
    $acsClient = new DefaultAcsClient($profile);                                            // 初始化SendSmsRequest实例用于设置发送短信的参数
    $request   = new SendSmsRequest();                                                      // 必填，设置雉短信接收号码
    $request->setPhoneNumbers($to);                                                         // 必填，设置签名名称
    $request->setSignName($signName);                                                       // 必填，设置模板CODE
    $request->setTemplateCode($templateCode);                                               // 可选，设置模板参数 //if($templateParam) { // $request->setTemplateParam(json_encode($templateParam)); // } //这里就是传递多个参数的地方喽 按照个人写法写哦，别写错哦
    $request->setTemplateParam(json_encode([  // 短信模板中字段的值
        "name"       => $templateParam['code']['name'],
        "title"      => $templateParam['code']['title'],
        "test1"      => $templateParam['code']['test1'],
        "test2"      => $templateParam['code']['test2'],
        "test3"      => $templateParam['code']['test3'],
        "num"        => $templateParam['code']['num'],
        "time"       => $templateParam['code']['time'],
        "address"    => $templateParam['code']['address'],
        "estaddress" => $templateParam['code']['estaddress'],
    ], JSON_UNESCAPED_UNICODE));                         //发起访问请求
    $acsResponse = $acsClient->getAcsResponse($request); //返回请求结果
    $result      = json_decode(json_encode($acsResponse), true);
    return $result;
}

/**
 * return success cr
 */
function return_msg($code, $msg = '', $data = [])
{
    $return_data['code'] = $code;
    $return_data['msg']  = $msg;
    if (empty($data)) {
        $return_data['data'] = [];
    } else {
        $return_data['data'] = $data;
    }
    header('Content-Type:application/json; charset=utf-8');
    echo json_encode($return_data, JSON_UNESCAPED_UNICODE);
    die;
}

/**
 * return error cr
 */
function return_error($msg)
{
    $return_data['code'] = 500;
    $return_data['msg']  = $msg;
    $return_data['data'] = [];
    header('Content-Type:application/json; charset=utf-8');
    echo json_encode($return_data, JSON_UNESCAPED_UNICODE);
    die;
}

/**
 * 系统加密方法
 * @param  string  $data    要加密的字符串
 * @param  string  $key     加密密钥
 * @param  int     $expire  过期时间 单位 秒
 *                          return string
 */
function md5_jia($data, $key = '', $expire = 0)
{
    $key  = md5(empty($key) ? config('DATA_AUTH_KEY') : $key);
    $data = base64_encode($data);
    $x    = 0;
    $len  = strlen($data);
    $l    = strlen($key);
    $char = '';
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) {
            $x = 0;
        }
        $char .= substr($key, $x, 1);
        $x++;
    }
    $str = sprintf('%010d', $expire ? $expire + time() : 0);
    for ($i = 0; $i < $len; $i++) {
        $str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1))) % 256);
    }
    return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($str));
}

/**
 * 系统解密方法
 * @param  string  $data  要解密的字符串 （必须是think_encrypt方法加密的字符串）
 * @param  string  $key   加密密钥
 *                        return string
 */
function md5_jie($data, $key = '')
{
    $key  = md5(empty($key) ? config('DATA_AUTH_KEY') : $key);
    $data = str_replace(['-', '_'], ['+', '/'], $data);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    $data   = base64_decode($data);
    $expire = substr($data, 0, 10);
    $data   = substr($data, 10);
    if ($expire > 0 && $expire < time()) {
        return '';
    }
    $x    = 0;
    $len  = strlen($data);
    $l    = strlen($key);
    $char = $str = '';
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) {
            $x = 0;
        }
        $char .= substr($key, $x, 1);
        $x++;
    }
    for ($i = 0; $i < $len; $i++) {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        } else {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return base64_decode($str);
}

//验证码验证
/**
 * 系统解密方法
 * @param  string  $phone  手机号
 * @param  string  $code   验证码
 *                         return string
 */

function verify_code($phone, $code)
{

    $session_data = Cache::get($phone);
    if ($session_data) {
        if ($session_data !== $code) {
            return_error("验证码有误");
        } else {
            return true;
        }
    } else {
        return_error("验证码已过期");
    }
}

//生成token
function generate_token($phone)
{
    $encryption_token = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz' . time() . $phone;
    return md5($encryption_token);
}

////验证token
function verify_token($uid, $token)
{

    $res = Db::name('member')->where('id', $uid)->find();
    if (!empty($res['id'])) {
        if ($res['token'] == $token) {
            if ($res['token_extime'] > time() || $res['token_extime'] < time()) {
                return $res;
            }
        } else {
            return_msg(401, 'token已过期');
        }
    } else {
        return_msg(401, '未注册用户');
    }


}

function updateimg($file)
{
    //上传文件
    $file = Request::file($file);
    //验证文件规则
    $result = validate(['file' => ['fileSize:102400,fileExt:gif,jpg,png']])->check(['file' => $file]);
    if ($result) {
        //上传到服务器,
        $path = Filesystem::disk('public')->putFile('upload', $file);
        //结果是 $path = upload/20200825\***.jpg

        //图片路径，Filesystem::getDiskConfig('public','url')功能是获取public目录下的storage，
        $picCover = Filesystem::getDiskConfig('public', 'url') . '/' . str_replace('\\', '/', $path);
        //结果是 $picCover = storage/upload/20200825/***.jpg
        //        return $picCover;
        return_msg(200, '上传成功', ['url' => $picCover]);
        //获取图片名称
        //        $fileName = $file->getOriginalName();
    } else {
        return_error('上传失败');
    }
}


// 判断身份证是否正确
function is_idcard($id)
{
    $id        = strtoupper($id);
    $regx      = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/";
    $arr_split = [];
    if (!preg_match($regx, $id)) {
        return false;
    }
    if (15 == strlen($id)) //检查15位
    {
        $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";

        @preg_match($regx, $id, $arr_split);
        //检查生日日期是否正确
        $dtm_birth = "19" . $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
        if (!strtotime($dtm_birth)) {
            return false;
        } else {
            return true;
        }
    } else      //检查18位
    {
        $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
        @preg_match($regx, $id, $arr_split);
        $dtm_birth = $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
        if (!strtotime($dtm_birth)) //检查生日日期是否正确
        {
            return false;
        } else {
            //检验18位身份证的校验码是否正确。
            //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
            $arr_int = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
            $arr_ch  = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
            $sign    = 0;
            for ($i = 0; $i < 17; $i++) {
                $b    = (int) $id[$i];
                $w    = $arr_int[$i];
                $sign += $b * $w;
            }
            $n       = $sign % 11;
            $val_num = $arr_ch[$n];
            if ($val_num != substr($id, 17, 1)) {
                return false;
            } //phpfensi.com
            else {
                return true;
            }
        }
    }

}

// 上传头像
function img($file)
{
    //接受前台传来的file文件
    //验证文件规则
    $result = validate(['file' => ['fileSize:102004000,fileExt:gif,jpg,png']])->check(['file' => $file]);
    if ($result) {
        //上传到服务器,
        $path = Filesystem::disk('public')->putFile('img', $file);
        $cc   = 'https://' . $_SERVER['HTTP_HOST'] . '/storage/' . $path;
        return $cc;
        //结果是 $path = upload/20200825\***.jpg
        //图片路径，Filesystem::getDiskConfig('public','url')功能是获取public目录下的storage，
        $picCover = Filesystem::getDiskConfig('public', 'url') . '/' . str_replace('\\', '/', $path);
        //结果是 $picCover = storage/upload/20200825/***.jpg
        //获取图片名称
        $fileName = $file->getOriginalName();
    } else {
        return false;
    }
}

// 上传文件
function files($file)
{
    //接受前台传来的file文件
    //验证文件规则
    $result = validate(['file' => ['fileSize:1002004000,fileExt:docx,TXT,txt,doc,pptx,xlsx,xls,pdf']])->check(['file' => $file]);
    if ($result) {
        //上传到服务器,
        $path = Filesystem::disk('public')->putFile('files', $file);
        $cc   = 'https://' . $_SERVER['HTTP_HOST'] . '/storage/' . $path;
        return $cc;
        //结果是 $path = upload/20200825\***.jpg
        //图片路径，Filesystem::getDiskConfig('public','url')功能是获取public目录下的storage，
        $picCover = Filesystem::getDiskConfig('public', 'url') . '/' . str_replace('\\', '/', $path);
        //结果是 $picCover = storage/upload/20200825/***.jpg
        //获取图片名称
        $fileName = $file->getOriginalName();
    } else {
        return false;
    }
}


// 上传视频
function video($file)
{
    //接受前台传来的file文件
    //验证文件规则
    $result = validate(['image' => 'filesize:990240000|fileExt:[AVI,wmv,MPEG,QuickTime,RealVideo,Flash,Mpeg-4,mov,rmvb,rm,FLV,mp4,3GP]'])->check(['file' => $file]);
    if ($result) {
        //上传到服务器,
        $path = Filesystem::disk('public')->putFile('video', $file, time());
        $cc   = 'https://' . $_SERVER['HTTP_HOST'] . '/storage/' . $path;
        return $cc;
    } else {
        return false;
    }
}

//验签
function getSign($params)
{
    $file = fopen('./log.txt', 'a+');
    fwrite($file, var_export($params, true));
    //    exit();
    ksort($params); //将参数数组按照参数名ASCII码从小到大排序
    foreach ($params as $key => $item) {
        if (!empty($item)) {                  //剔除参数值为空的参数
            $newArr[] = $key . '=' . $item;   // 整合新的参数数组
        }
    }
    $stringA = implode("&", $newArr); //使用 & 符号连接参数

    $stringSignTemp = $stringA . "&key=" . 'f11dfab18684b471577ba612bf51elll'; //拼接key
    // key是在商户平台API安全里自己设置的
    $stringSignTemp = MD5($stringSignTemp);                                    //将字符串进行MD5加密
    $sign           = strtoupper($stringSignTemp);                             //将所有字符转换为大写
    return $sign;
}

function xmlToArray($xml)
{
    //禁止引用外部xml实体
    //    libxml_disable_entity_loader(true);
    //    $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    //    return $values;
    $result = is_string($xml) ? simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA) : $xml;
    return json_decode(json_encode($result, JSON_UNESCAPED_UNICODE), true);
}


//生成二维码    邀请码code
function qr($punch_positions_id)
{
    require "../vendor/phpqrcode/phpqrcode.php";
    $filename             = 'qrcode/' . time() . rand(10000, 9999999) . '.png';
    $value                = "https://sntasx.gtpnb.cn/peifalse?sid=" . $punch_positions_id;//二维码内容
    $invitation_code      = $value;
    $v                    = $invitation_code;//二维码内容
    $errorCorrectionLevel = 'L';             //容错级别
    $matrixPointSize      = 5;               //生成图片大小
    if (!is_dir("qrcode")) {
        // 创建文件加
        mkdir("qrcode");
    }
    \QRcode::png($v, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
    return $filename;
}

//二维码与图片合并

//生成二维码    邀请码code
function qrs()
{
    require "../vendor/phpqrcode/phpqrcode.php";
    $filename             = 'qrcode/' . time() . rand(10000, 9999999) . '.png';
    $value                = "https://fucaitongzhi.12d3.cn/apk/1.apk";//二维码内容
    $invitation_code      = $value;
    $v                    = $invitation_code;//二维码内容
    $errorCorrectionLevel = 'L';             //容错级别
    $matrixPointSize      = 5;               //生成图片大小
    if (!is_dir("qrcode")) {
        // 创建文件加
        mkdir("qrcode");
    }
    \QRcode::png($v, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
    return $filename;
}

function get_img($inv)
{
    $a = sysdata('cropper');
    $b = json_decode($a['postion'], true);
    require_once('../vendor/phpqrcode/phpqrcode.php');
    //生成二维码的链接
    $value                = "https://fucaitongzhi.12d3.cn/h5/?pid=" . $inv;     //二维码内容
    $errorCorrectionLevel = 'H';                                                //容错级别
    $matrixPointSize      = 7;                                                  //图片大小慢慢自己调整，只要是int就行
    $size                 = floor(($b['width'] - ($b['width'] * 0.135)) / 37 * 100) / 100;
    $filename             = 'qrcode/' . time() . rand(10000, 9999999) . '.png';
    $padding              = 3;
    \QRcode::png($value, $filename, $errorCorrectionLevel, $size, $padding);
    $QR2 = $filename;
    //添加背景图片合成
    $dst_path = $a['image'];                                                    //背景图片路径
    $src_path = $QR2;                                                           //覆盖图
    //创建图片的实例
    $dst = imagecreatefromstring(file_get_contents($dst_path));
    $src = imagecreatefromstring(file_get_contents($src_path));
    //获取覆盖图图片的宽高
    [$src_w, $src_h] = getimagesize($src_path);
    //将覆盖图复制到目标图片上，最后个参数100是设置透明度（100是不透明），这里实现不透明效果
    imagecopymerge($dst, $src, $b['x'], $b['y'], 0, 0, $src_w, $src_h, 100);    //位置可以自己调试
    //        @unlink($QIMG); //删除二维码与logo的合成图片
    //    @unlink($QRB);  //删除服务器上二维码图片
    header("Content-type: image/png");
    $lu = 'qrcode/' . time() . rand(10000, 9999999) . '.png';
    //    imagepng($dst, 'qrcode/'.$time."/".'.png');//根据需要生成相应的图片
    imagepng($dst, $lu);                                                        //根据需要生成相应的图片
    imagedestroy($dst);
    imagedestroy($src);
    return $lu;
}


function get_sign($data)
{
    ksort($data);
    $str = '';
    foreach ($data as $key => $value) {
        $str .= !$str ? $key . '=' . $value : '&' . $key . '=' . $value;
    }
    $str  .= '&key=' . ('zhongyuanjuxin1314521ganjinfafa8');  //商户号 key
    $sign = strtoupper(md5($str));
    return $sign;
}


/**
 * 打印日志文件
 * @author        HaoChen
 * @module_name   日志指定存放目录
 * @notice_header 打印的日志信息
 * @notice_body   说明性的文字,可以为空
 * 2017-01-08
 */


function write($module_name, $notice_header, $notice_body = '')
{
    $path = './YinLogs/';
    if (!file_exists($path)) {
        @mkdir($path, 0755);
    }
    $date_str = date('Y-m-d');
    $date_fmt = date('Y-m-d H:i:s', time());
    $path     = $path . $module_name . '/';
    if (!file_exists($path)) {
        @mkdir($path, 0755);
    }
    $filepath = $path . $date_str . '.log';
    if (!$fp = @fopen($filepath, 'ab')) {
        return false;
    }
    $message = $date_fmt . '::' . $notice_header . '::' . $notice_body . "\n";
    flock($fp, LOCK_EX);
    fwrite($fp, $message);
    flock($fp, LOCK_UN);
    fclose($fp);
    @chmod($filepath, 0755);
    return true;
}


/**
 * 获取时间戳
 * $Ymd = Y 年
 * $Ymd = m 月
 * $Ymd = d 日
 * $Ymd = NULL 当前时间戳
 * $xia = true 是否取下次开始时间戳：取下年开始时间戳 或者下月开始时间戳  或者明日开始时间戳
 */
function getTime($Ymd = null, $xia = false)
{
    if ($Ymd == 'Y' && $xia == true) {
        //取下个年度开始时间戳
        return strtotime((date('Y', time()) + 1) . '-01-01 00:00:00');
    } else {
        if ($Ymd == 'Y') {
            //取本年度开始时间戳
            return strtotime(date('Y', time()) . '-01-01 00:00:00');
        } else {
            if ($Ymd == 'm' && $xia == true) {
                //取下个月度开始时间戳
                $xiayue_nianfen = date('Y', time());
                $xiayue_yuefen  = date('m', time());
                if ($xiayue_yuefen == 12) {
                    $xiayue_nianfen += 1;    //如果月份等于12月，那么下月年份+1
                    $xiayue_yuefen  = 1;     //如果月份等于12月，那么下月月份=1月
                } else {
                    $xiayue_yuefen += 1;    //如果月份不是12月，那么在当前月份上+1
                }
                return strtotime($xiayue_nianfen . '-' . $xiayue_yuefen . '-01 00:00:00');
            } else {
                if ($Ymd == 'm') {
                    //取本月度开始时间戳
                    return strtotime(date('Y-m', time()) . '-01 00:00:00');
                } else {
                    if ($Ymd == 'd' && $xia == true) {
                        //取明日开始时间戳
                        return strtotime(date('Y-m-d', time()) . ' 00:00:00') + 86400;
                    } else {
                        if ($Ymd == 'd') {
                            //取今日开始时间戳
                            return strtotime(date('Y-m-d', time()) . ' 00:00:00');
                        } else {
                            //取当前时间戳
                            return time();
                        }
                    }
                }
            }
        }
    }
}


// 查出个人信息
function member($uid)
{
    // 查出个人信息
    $re = Db::name('member')->where(['id' => $uid, 'deleted' => 0])->find();
    if ($re) {
        if ($re['status'] == 0) {
            return_error('当前账户已被封禁，请联系客服人员');
        }
        return $re;
    } else {
        return_error('个人信息有误，请刷新后再试');
    }
}

// 查出个人信息
function data_user($uid)
{
    // 查出个人信息
    $re = Db::name('data_user')->where(['id' => $uid])->find();

    if ($re) {
        return $re;
    } else {
        return_error('个人信息有误，请刷新后再试');
    }
}

// 查出个人上级信息
function shangjixinxi($uid)
{
    $re  = Db::name('member')->where('id', $uid)->find();
    $res = Db::name('member')->where('id', $re['pid'])->find();
    if ($res) {
        return $res;
    } else {
        return false;
    }
}

// 查出个人上上级信息
function shangjixinxisj($uid)
{
    $re   = Db::name('member')->where('id', $uid)->find();
    $res  = Db::name('member')->where('id', $re['pid'])->find();
    $ress = Db::name('member')->where('id', $res['pid'])->find();
    if ($ress) {
        return $ress;
    } else {
        return false;
    }
}

// 获取多久以后的时间戳
function Some_points_after_the_timestamp($time)
{
    $date = date('Y-m-d');
    $t    = date("t", strtotime($date));
    $a    = date('i') + $time; // 分
    if ($a > 60) {
        $b = $a - 60;
        $h = date('H') + 1; // 时
        if ($h > 24) {
            $l = $h - 24;
            $d = date('d') + 1; // 天
            if ($d > $t) {
                $f  = $d - $t;
                $tt = date("t") + 1; // 月
                if ($tt > 12) {
                    $y        = $tt - 12;
                    $YY       = date("Y") + 1; // 年
                    $strotime = strtotime(date("{$YY}-{$y}-{$f} {$l}:{$b}:s"));
                } else {
                    $strotime = strtotime(date("Y-{$tt}-{$f} {$l}:{$b}:s"));
                }
            } else {
                $strotime = strtotime(date("Y-m-{$d} {$l}:{$b}:s"));
            }
        } else {
            $strotime = strtotime(date("Y-m-d {$h}:{$b}:s"));
        }
    } else {
        $strotime = strtotime(date("Y-m-d H:{$a}:s"));
    }
    return $strotime;
}

function expressQuery($order_no, $phone)
{
    if ($order_no == "") {
        return_error('订单编号有误');
    }
    if ($phone == "") {
        return_error('订单手机号不能为空');
    }
    $url                = "https://api.topthink.com/express/query";
    $request["appCode"] = "da0c5e8ce0a8ef4b6027b334906f0e2f";
    $request["nu"]      = $order_no;//快递编号
    //        $request["com"] = $order["express"];//快递名字
    $request["phone"] = $phone;
    $result           = request_post($url, $request);
    $result1          = json_decode($result, true);
    if ($result1["message"] == "Success") {
        return $result1["data"];
    } else {
        return_error('暂无信息');
    }
}

function request_post($url = '', $post_data = [])
{
    if (empty($url) || empty($post_data)) {
        return false;
    }
    // 传输数据转为json格式
    $json_data = json_encode($post_data);
    $postUrl   = $url;
    $curlPost  = $json_data;
    //初始化curl
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $postUrl);    //抓取指定网页
    curl_setopt($ch, CURLOPT_HEADER, 0);        //设置header
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
    // post提交方式
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
    // Header配置
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type:application/json;charset=utf-8',
        'Content-Length:' . strlen($curlPost),
    ]);
    // 运行curl
    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
    // json数据
    // return json_decode($data, true);
}

if (!function_exists('generateRandomUsername')) {
    function generateRandomUsername($length = 6)
    {
        $characters      = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $username        = '';
        $characterLength = strlen($characters);

        for ($i = 0; $i < $length; $i++) {
            $username .= $characters[rand(0, $characterLength - 1)];
        }

        return $username;
    }
}

if (!function_exists('build_img_url')) {
    function build_img_url($imgUrl)
    {
        return $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $imgUrl;
    }
}
